package http;

import android.net.Uri;

import org.apache.http.NameValuePair;

import com.erp.service.util.net.IResponseInfo;

import java.io.IOException;
import java.util.List;
import java.util.Map;

public interface IHttpClient {
	
    /**
     * 设置提交方式(默认为GET)
     * @param httpMethod
     * @return
     */
    IHttpClient setHttpMethod(HTTPMethod httpMethod);

    /**
     * 设置服务器的主机头地址
     * @param serverUrl
     * @return
     */
    IHttpClient setServerUrlPrefix(String serverUrl);

	/**
	 * 设置请求访问地址
	 * @param appendUrl
	 * @return
	 */
    IHttpClient setAppendUrl(String appendUrl);

    /**
     * 设置访问的完整地址
     * @param fullUrl
     * @return
     */
    IHttpClient setFullUrl(String fullUrl);
    
    /**
     * 设置访问的完整地址
     * @param fullUri
     * @return
     */
    IHttpClient setFullUrl(Uri fullUri);

    /**
     * 设置请求头信息
     * @param headers
     * @return
     */
    IHttpClient setHeaders(Map<String, String> headers);

    /**
     * 设置请求头信息
     * @param name
     * @param value
     * @return
     */
    IHttpClient setHeader(String name, String value);

    /**
     * 设置请求参数
     * @param queryString
     * @return
     */
    IHttpClient setQueryStrings(Map<String, String> queryString);

    /**
     * 设置请求参数
     * @param queryStrings
     * @return
     */
    IHttpClient setQueryStrings(List<NameValuePair> queryStrings);

    /**
     * 设置请求参数
     * @param name
     * @param value
     * @return
     */
    IHttpClient setQueryString(String name, String value);
    
    /**
     * 设置连接超时时长
     * @param timeout
     * @return
     */
    IHttpClient setConnectTimeout(int imeout);
    
    /**
     * 设置请求超时时长
     * @param timeout
     * @return
     */
    IHttpClient setReadTimeout(int timeout);
    
    /**
     * 设置请求主体内容
     * @param bodyString
     * @return
     */
    IHttpClient setBodyString(String bodyString);  

    /**
     * 设置请求主体内容
     * @param entity
     * @return
     */
    IHttpClient setJsonBody(Object entity);
    
    /**
     * 获取完整的URI地址，带请求参数的
     * @return
     */
    Uri getUriWithQueryString();
    
    
    /**
     * 发送同步请求
     * @param entityType
     * @return
     * @throws IOException
     */
    <T> T send(Class<T> entityType) throws HTTPException;
    
    /**
     * 发送异步请求
     * @param entityType
     * @param listener
     * @throws IOException
     */
    <T> void sendAsync(Class<T> entityType, IHTTPListener<T> listener) throws HTTPException;
    
    /**
     * 发送同步请求，返回流数据
     * @return
     * @throws IOException
     */
    IResponseInfo send() throws HTTPException;
    
    /**
     * 发送异步请求，返回流数据
     * @param listener
     * @throws IOException
     */
    void sendAsync(IHTTPListener<IResponseInfo> listener);
    
    /**
     * 发送同步请求，返回字符串
     * @return
     * @throws IOException
     */
    String sendForString() throws HTTPException;
    
    /**
     * 发送异步请求，返回字符串
     * @return
     * @throws IOException
     */
    void sendAsyncForString(IHTTPListener<String> listener) throws HTTPException;

    /**
     * 发送同步请求，返回列表
     * @param entityType
     * @return
     * @throws IOException
     */
    <T> List<T> sendForList(Class<T> entityType) throws HTTPException;
    
    /**
     * 发送异步请求，返回列表
     * @param entityType
     * @param listener
     * @throws IOException
     */
    <T> void sendAsyncForList(Class<T> entityType, IHTTPListener<List<T>> listener) throws HTTPException;

}
